perm filename ARITH.PAL[HAL,HE] blob
sn#274012 filedate 1977-04-06 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 .TITLE ARITH
C00004 00003 ASIN - FLOATING POINT, SINGLE PRECISION ARC-SINE FUNCTION
C00005 00004 ACOS - FLOATING POINT, SINGLE PRECISION ARC-COSINE FUNCTION
C00006 00005 ATAN2 - FLOATING POINT, SINGLE PRECISION ARC-TANGENT WITH TWO ARGUMENTS
C00009 00006 "SNCOS" - SINE/COSINE FUNCTION USING TABLE LOOKUP
C00012 00007 SINE/COSINE LOOK UP TABLES
C00016 00008 ARCTANGENT LOOK UP TABLES
C00020 ENDMK
C⊗;
.TITLE ARITH
;"SQRTF" - FLOATING POINT SQUARE ROOT
;COMPUTES THE SQUARE ROOT OF THE NUMBER LOADED INTO AC0 BY USING
;A LINEAR APPROXIMATION AND PERFORMING ONE CONVERGENCE INTERATION.
;THE ANSWER IS RETURNED IN AC0 AND IS ACCURATE TO APPROMIATELY
;+ OR - .0076%. A SAMPLE CALLING SEQUENCE FOLLOWS:
;
; LDF NUMBER,AC0
; JSR PC,SQRTF
;
;EXECUTION TIME FOR THIS ROUTINE IS APPROXIMATELY 110 MICRO-SECONDS.
;REGISTERS USED:
; AC0 PASSES ARGUMENTS AND AC1 IS GARBAGED
SQRTF: ABSF AC0 ;ARG MUST BE > 0
MOV R0,-(SP)
STEXP AC0,R0 ;EXPONENT ← EXPONENT/2
STF AC0,AC1
INC R0
ASR R0
BCS 1$
LDEXP #-1,AC1 ;1/4 ≤ ARG < 1/2
MULF ASM,AC1 ;LINEAR APPROXIMATION
ADDF BSM,AC1
BR 2$
1$: LDEXP #0,AC1 ;1/2 ≤ ARG ≤ 1
MULF ALG,AC1
ADDF BLG,AC1
2$: LDEXP R0,AC1 ;SQRT ← ((ARG/GUESS)+GUESS)*.5
DIVF AC1,AC0
MOV (SP)+,R0
ADDF AC1,AC0
MULF #40000,AC0
RTS PC
ASM: .FLT2 0.8125000
ALG: .FLT2 0.5781250
BSM: .FLT2 0.3027340
BLG: .FLT2 0.4218750
;END OF "SQRTF"
;ASIN - FLOATING POINT, SINGLE PRECISION ARC-SINE FUNCTION
;COMPUTES THE ARCSINE OF AN VALUE USING THE FOLLOWING ALGORITHM
;
; ASIN(X) = ATAN2(X,SQRT(1-X**2))
;
;WHERE X IS IN THE RANGE -1.0 TO +1.0. THE ARGUMENT X MUST BE
;LOADED INTO AC0 BEFORE THE CALL TO ASIN. AFTER EXECUTION ASIN
;RETURNS THE ARCSINE VALUE IN AC0 ( IN DEGREES ).
;REGISTERS USED:
;
; AC0 PASSES ARGUMENTS
; AC1,AC2 GARBAGED
ASIN: STF AC0,AC2 ;COMPUTE SQRT(1-SIN↑2)
MULF AC0,AC0
NEGF AC0
ADDF #40200,AC0
JSR PC,SQRTF
STF AC0,AC1
STF AC2,AC0
JSR PC,ATAN2 ;ARC TANGENT( SIN, SQRT(1-SIN↑2) )
RTS PC
;END OF "ASIN"
;ACOS - FLOATING POINT, SINGLE PRECISION ARC-COSINE FUNCTION
;COMPUTES THE ARC-COSINE OF AN VALUE USING THE FOLLOWING ALGORITHM
;
; ACOS(X) = ATAN2( SQRT(1-COSX↑2),COS X )
;
;WHERE X IS IN THE RANGE -1.0 TO +1.0. THE ARGUMENT X MUST BE
;LOADED INTO AC0 BEFORE THE CALL TO ACOS. AFTER EXECUTION ACOS
;RETURNS THE ARC-COSINE VALUE IN AC0 ( IN DEGREES ).
;REGISTERS USED:
;
; AC0 PASSES ARGUMENTS
; AC1,AC2 GARBAGED
ACOS: STF AC0,AC2 ;COMPUTE SQRT(1-COS↑2)
MULF AC0,AC0
NEGF AC0
ADDF #40200,AC0
JSR PC,SQRTF
STF AC2,AC1
JSR PC,ATAN2 ;ARC TANGENT( SQRT(1-COS↑2), COS )
RTS PC
;END OF "ACOS"
;ATAN2 - FLOATING POINT, SINGLE PRECISION ARC-TANGENT WITH TWO ARGUMENTS
;COMPUTES THE ARC-TANGENT OF A/B USING A TABLE LOOK UP SCHEME. SINCE
;TWO ARGUMENTS ARE USED SINGULARITIES ARE AVOIDED AT MULTIPLES OF PI/2
;AND THERE IS NO AMBIGUITY CONCERNING QUADRANTS. THE ARGUMENT A MUST
;BE LOADED INTO AC0 AND B INTO AC1 BEFORE CALLING ATAN2. AFTER EXECUTION,
;ATAN RETURNS THE ARC-TANGENT IN DEGREES IN AC0. RUN TIME IS APPROXIMATELY
;140 MICRO SECONDS.
;REGISTERS USED:
;
; AC0,AC1 PASSES ARGUMENTS
; AC2 GARBAGED
SSIN==1 ;SINE IS NEGATIVE
SCOS==2 ;COSINE IS NEGATIVE
CMPANG==4 ;COMPLEMENTARY ANGLE
ATAN2: MOV R0,-(SP) ;SAVE REGISTERS
MOV R1,-(SP)
CLR R0
TSTF AC0 ;SIN > 0 ?
CFCC
BLT SINNEG
BGT SINPOS
TSTF AC1 ;SIN = 0, COS > 0?
CFCC
BPL .+6
LDF #42064,AC0 ;THETA = 180 DEGREES
JRET: MOV (SP)+,R1
MOV (SP)+,R0
RTS PC
SINNEG: NEGF AC0 ;ABS(SIN)
BIS #SSIN,R0 ;INDICATE SIN < 0
SINPOS: TSTF AC1 ;COS > 0 ?
CFCC
BLT COSNEG
BGT COSPOS
LDF #41664,AC0 ;THETA = 90 DEGREES
BIT #SSIN,R0
BEQ JRET
NEGF AC0
BR JRET
COSNEG: NEGF AC1 ;ABS(COS)
BIS #SCOS,R0 ;INDICATE COS < 0
COSPOS: CMPF AC0,AC1
CFCC
BGT 1$ ;MUST EXCHANGE
BNE 2$
LDF #41464,AC0 ;THETA = 45 DEGREES
BR 4$
1$: DIVF AC0,AC1
BIS #CMPANG,R0
STF AC1,AC0
BR 3$
2$: DIVF AC1,AC0
3$: MODF #42000,AC0 ;GET INDEX, INTERPOLATION FACTOR
STCFI AC1,R1 ;INDEX
ASH #2,R1
LDF ARCTAN+4(R1),AC2 ;INTERPOLATE
LDF ARCTAN(R1),AC1
SUBF AC1,AC2
MULF AC0,AC2
STF AC1,AC0
ADDF AC2,AC0
4$: BIT #CMPANG,R0 ;COMPLEMENT?
BEQ 5$
SUBF #41664,AC0
NEGF AC0
5$: BIT #SCOS,R0 ;COS THETA < 0?
BEQ 6$
SUBF #42064,AC0
NEGF AC0
6$: BIT #SSIN,R0 ;SIN THETA < 0?
BEQ JRET
NEGF R0
BR JRET
;END OF "ATAN2"
;"SNCOS" - SINE/COSINE FUNCTION USING TABLE LOOKUP
;THIS PROGRAM CALCULATES BOTH THE SINE AND THE COSINE OF A ANGLE USING
;A TABLE LOOP UP PROCEDURE. THE IMPLEMENTED APPROXIMATION EQUATIONS
;ARE AS FOLLOWS:
; SIN(X) = SIN(A) + (B/I)*[SIN(A+I)-SIN(A)]
; COS(X) = COS(A) + (B/I)*[COS(A+I)-COS(A)]
; WHERE
; I = 90/128 DEGREES
; A = INTEGER(X*128/90)
; B = REMAINDER(X*128/90)
;
;THE ANGLE SHOULD MUST BE IN DEGREES AND MUST BE LOADED INTO AC0 BEFORE
;CALLING THIS ROUTINE. ON EXITING, THE SIN IS LEFT IN AC0 AND THE COSINE
;IS LEFT IN AC1. EXECUTION TIME IS APPROXIMATELY 120 MICRO-SECONDS.
;REGISTERS USED:
; AC0,AC1 PASS ARGUMENTS AND ARE ALTERED
; AC2,AC3 ARE GARBAGED
SNCOS: MODF 3$,AC0 ;SEPARATE INDEX AND FRACTION
MOV R1,-(SP) ;SAVE REGISTERS
MOV R0,-(SP)
STCFI AC1,R0 ;INDEX INTO LOOKUP TABLE
MOV R0,R1 ;SAVE SIGN OF ANGLE
BIC #177600,R0
ASH #2,R0
LDF SINTAB+4(R0),AC1 ;SIN(A+I)
LDF SINTAB(R0),AC2 ;SIN(A)
SUBF AC2,AC1
ASR R1
MULF AC0,AC1 ;(B/I)*[SIN(A+1)-SIN(A)]
SWAB R1
ADDF AC2,AC1 ;NOW HAVE ABS(SIN(X))
NEG R0 ;ENTER TABLE FROM OPPOSITE END
LDF COSTAB-4(R0),AC2 ;COS(A+I)
LDF COSTAB(R0),AC3 ;COS(A)
SUBF AC3,AC2
MULF AC0,AC2 ;(B/I)*[COS(A+I)-COS(A)]
MOV (SP)+,R0 ;DON'T NEED THIS ANY MORE
BIT #40000,R1 ;WHICH IS THE SIN?
ADDF AC3,AC2 ;NOW HAVE ABS(COS(X))
BEQ 1$
STF AC2,AC0 ;SWITCH SIN ↔ COSINE
BR 2$
1$: STF AC1,AC0 ;SAVE SIN, COSINE
STF AC2,AC1
2$: TST R1 ;SIN ← -SIN IF X IN QUAD 3 OR 4
BPL .+4
NEGF AC0
ADD #40000,R1 ;COS ← -COS IF QUADRANT 2 OR 3
BPL .+4
NEGF AC1
MOV (SP)+,R1
RTS PC
3$: .FLT2 1.422222 ;128/90 = 1.422222
;END OF "SNCOS"
;SINE/COSINE LOOK UP TABLES
SINTAB: .WORD 0, 0, 36511, 7220, 36711, 5260, 37026,141454
.WORD 37110,175460, 37173, 25564, 37226,124405, 37257,133200
.WORD 37310,136466, 37341,136056, 37372,131163, 37411,147606
.WORD 37426, 40203, 37442,125666, 37457, 10242, 37473, 67317
.WORD 37507,142702, 37524, 12401, 37540, 56023, 37554,115177
.WORD 37570,147714, 37602, 76700, 37610,107223, 37616,115042
.WORD 37624,120062, 37632,120206, 37640,115345, 37646,107422
.WORD 37654, 76324, 37662, 61757, 37670, 42052, 37676, 16512
.WORD 37703,167425, 37711,134523, 37717, 75712, 37725, 33101
.WORD 37732,164201, 37740,111117, 37746, 31565, 37753,145673
.WORD 37761, 55352, 37766,160313, 37774, 56447, 40000,163744
.WORD 40003,116075, 40006, 45603, 40010,172633, 40013,115153
.WORD 40016, 34732, 40020,151715, 40023, 64052, 40025,173331
.WORD 40030, 77700, 40033, 1306, 40035, 77721, 40037,173313
.WORD 40042, 63631, 40044,151045, 40047, 33126, 40051,112025
.WORD 40053,165512, 40056, 35736, 40060,102673, 40062,144311
.WORD 40065, 2363, 40067, 35043, 40071, 64102, 40073,107473
.WORD 40075,127371, 40077,143547, 40101,154160, 40103,161001
.WORD 40105,162003, 40107,157145, 40111,150422, 40113,135770
.WORD 40115,117402, 40117, 75037, 40121, 46475, 40123, 14111
.WORD 40124,155461, 40126,112745, 40130, 44123, 40131,171152
.WORD 40133,112032, 40135, 26523, 40136,137005, 40140, 43041
.WORD 40141,142630, 40143, 36132, 40144,125131, 40146, 7610
.WORD 40147, 65730, 40150,137474, 40152, 4647, 40153, 45414
.WORD 40154,101537, 40155,131223, 40156,154236, 40157,172563
.WORD 40161, 4410, 40162, 11522, 40163, 12110, 40164, 5735
.WORD 40164,175013, 40165,157306, 40166,135007, 40167,105705
.WORD 40170, 51770, 40171, 11230, 40171,143635, 40172, 71402
.WORD 40173, 12276, 40173,126315, 40174, 35450, 40174,137711
.WORD 40175, 35254, 40175,125713, 40176, 11443, 40176, 70260
.WORD 40176,142155, 40177, 7130, 40177, 47155, 40177,102253
.WORD 40177,130417, 40177,151627, 40177,166103, 40177,175421
COSTAB: .WORD 40200, 0
;ARCTANGENT LOOK UP TABLES
ARCTAN: .WORD 0, 0, 37745, 26657, 40145, 25033, 40253,155433
.WORD 40345, 15712, 40417, 25252, 40453,141371, 40510, 52757
.WORD 40544,161252, 40600,132045, 40616,171370, 40635, 26536
.WORD 40653, 61353, 40671,111461, 40707,136703, 40725,161067
.WORD 40744, 42, 40762, 13434, 41000, 11537, 41007, 13517
.WORD 41016, 13456, 41025, 11311, 41034, 4757, 41042,176160
.WORD 41051,165034, 41060,151305, 41067,133074, 41076,112127
.WORD 41105, 66347, 41114, 37702, 41123, 6276, 41131,151661
.WORD 41140,112164, 41147, 47337, 41156, 1313, 41164,130024
.WORD 41173, 53224, 41200,175425, 41204, 43531, 41207,110006
.WORD 41212,152413, 41216, 13131, 41221, 51741, 41224,106624
.WORD 41227,141545, 41232,172506, 41236, 21451, 41241, 46403
.WORD 41244, 71310, 41247,112153, 41252,130743, 41255,145445
.WORD 41260,160046, 41263,170336, 41266,176504, 41272, 2517
.WORD 41275, 4367, 41300, 4065, 41303, 1402, 41305,174527
.WORD 41310,165457, 41313,154203, 41316,140516, 41321,122614
.WORD 41324,102472, 41327, 60121, 41332, 33320, 41335, 4263
.WORD 41337,152767, 41342,117232, 41345, 61232, 41350, 20767
.WORD 41352,156256, 41355,111276, 41360, 42050, 41362,170354
.WORD 41365,114410, 41370, 36176, 41372,155520, 41375, 72574
.WORD 41400, 2603, 41401, 46770, 41402,112035, 41403,153763
.WORD 41405, 14574, 41406, 54272, 41407,112655, 41410,150127
.WORD 41412, 4272, 41413, 37330, 41414, 71263, 41415,122115
.WORD 41416,151647, 41420, 304, 41421, 25647, 41422, 52122
.WORD 41423, 75306, 41424,117410, 41425,140431, 41426,160374
.WORD 41427,177264, 41431, 15103, 41432, 31655, 41433, 45365
.WORD 41434, 60034, 41435, 71450, 41436,102032, 41437,111366
.WORD 41440,117676, 41441,125167, 41442,131443, 41443,134706
.WORD 41444,137143, 41445,140375, 41446,140631, 41447,140070
.WORD 41450,136337, 41451,133621, 41452,130121, 41453,123444
.WORD 41454,116014, 41455,107415, 41456,100053, 41457, 67551
.WORD 41460, 56313, 41461, 44125, 41462, 31011, 41463, 14753
.WORD 41464, 0
;END OF "ARITH"